package thread;

import java.util.Scanner;

public class Demo23 {
    public static void main(String[] args) {
        Object locker=new Object();
        Thread t1=new Thread(()->{
            System.out.println("t1 wait 之前");
            try{
                synchronized (locker){
                    locker.wait();
                }
            }catch (InterruptedException e){
                throw new RuntimeException();
            }
            System.out.println("t1 wait 之后");
        });
        Thread t2=new Thread(()->{
            System.out.println("t2 wait 之前");
            try{
                synchronized (locker){
                    locker.wait();
                }
            }catch (InterruptedException e){
                throw new RuntimeException();
            }
            System.out.println("t2 wait 之后");
        });
        Thread t3=new Thread(()->{
            Scanner scanner=new Scanner(System.in);
            System.out.println("输入任意内容 通知唤醒所有线程");
            scanner.next();
            synchronized (locker){
                locker.notify();
            }
            scanner.next();
            synchronized (locker){
                locker.notify();
            }
            /*synchronized (locker){
                locker.notifyAll();
            }*/
        });
        t1.start();
        t2.start();
        t3.start();
        //有几个wait 就有几个notify
        //使用notifyAll() 唤醒所有线程 其实也是一个wait解锁->加锁->释放锁后 下一个notify继续唤醒下一个wait 具体唤醒哪个是随机的
        //唤醒一个线程 由于wait之后加锁 其他线程由于锁竞争 继续等待阻塞
        //wait和join一样可以有时间限制
      /* 1.wait 需要搭配 synchronized 使⽤sleep不需要
        2.wait是Object的⽅法 sleep是Thread的静态⽅法*/
    }
}
